from typing import List, re

from langchain.agents import create_openai_functions_agent, AgentExecutor
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain_core.tools import Tool, StructuredTool

from core.llm import get_default_llm
from tools.ppt_tool import PPTGenerator


def create_ppt_agent():
    ppt_generator = PPTGenerator()
    tools = [
        StructuredTool.from_function(
            func=ppt_generator.generate_with_logging,
            name="generate_ppt",
            description="生成PPT的工具",
        )
    ]

    prompt = ChatPromptTemplate.from_messages([
    ("system", """你是一个专业的PPT设计师，可以帮助用户生成高质量的PPT。你必须严格按照以下步骤操作：

1. 从用户输入中提取两个关键信息：
   - 主题：在 content的内容为 之后，如"2025年的创业机遇"
   - 页数：通常以"需要X页"的形式出现，会重复出现五次，如"需要3页,需要3页,需要3页,需要3页,需要3页,需要3页"表示pages=3

2. 调用generate_ppt工具时，必须同时提供content和pages两个参数。

3. 重要提醒：
   - 你必须从用户输入中找到"需要X页"，并将X作为pages参数的值
   - 你必须同时提供topic和pages两个参数
   - 你绝对不能省略任何参数
   - 你绝对不能使用默认的页数

4. 调用示例：
   用户输入："content的内容为：2025年的创业机遇   需要3页,需要3页,需要3页,需要3页,需要3页,需要3页,"
   你应该调用：generate_ppt(content="2025年的创业机遇", pages=3)
   
5. 调用成功后你需要将调用工具generate_with_logging的返回结果原封不动的返回回来，注意，不要加任何东西，返回内容是什么你就返回什么"""),
    ("human", "content的内容为：{content}"),
    ("human", "需要{page}页,需要{page}页,需要{page}页,需要{page}页,需要{page}页"),
    MessagesPlaceholder(variable_name="agent_scratchpad")
])


    llm = get_default_llm()
    agent = create_openai_functions_agent(
        llm=llm,
        tools=tools,
        prompt=prompt,
    )
    agent_executor = AgentExecutor.from_agent_and_tools(
        agent=agent,
        tools=tools,
        verbose=True,
        max_iterations=3,
        handle_parsing_errors=True,
    )
    return agent_executor

def create_ppt(content, pages):
    agent = create_ppt_agent()
    result = agent.invoke({"content":content, "page":pages})
    return result["output"]
